/*
 ============================================================================
 Name        : TpDatos.c
 Author      : Bayetto - Cagnone
 Version     :
 Copyright   : Your copyright notice
 Description : Trabajo Practico: Batalla de Compresores
 ============================================================================
 */


#include "BlockSorting.h"
#include "MTF.h"
#include "Estructurado.h"

#define ERR_PAR "Ingreso de parámetros inválido\n" //Error code:-1
#define ERR_ACCION "Ingreso de acción inválida. Ingrese C o X\n"//Error code:-1
#define ERR_ABRIR_ARCH_ENT "Error al abrir el archivo de entrada\n" // Error code:-2
#define ERR_ARCH_ENT "Error en el archivo de entrada\n" //Error code:-2
#define ERR_MEM "Error al asignar memoria\n" //Error code:-3

int validar_parametros(int argc,char **argv,char** accion,char** ruta1);

int main (int argc, char** argv)
{
	char* accion,*ruta1;
	int i = 0;
	unsigned char l[TAM_BLOQUE];
	FILE *fpEntrada;
	char* linea;
	char* ruta;


	//Valido parametros de entrada
	if (validar_parametros(argc,argv,&accion,&ruta1)!= 0){
		fprintf(stderr,ERR_PAR);
		return -1;
	}

	//Abro archivo de entrada
	ruta = (char*)malloc((strlen(argv[2])+1)*sizeof(char));

	if (ruta == NULL){
		fprintf(stderr,ERR_MEM);
		return -3;
	}

	strcpy(ruta,argv[2]);
	fpEntrada = fopen(ruta,"r");

	free(ruta);
	if (fdentrada == NULL) {
		fprintf(stderr,ERR_ARCH_ENT);
		return -2;
	}

	//Manejo de acciones
	if (strcmp(accion,"c")==0){
		//Comprimo
		printf("//Comprimo//\n"); //TODO: Sacar

		//while (!feof(fpEntrada))
		//{
			linea = (char*)malloc(TAM_BLOQUE*sizeof(char));
			fgets(linea,TAM_BLOQUE+1,fpEntrada);

			printf("ENTRADA // %s\n",linea); //TODO: Sacar

			//BLOCK SORTING
			aplicarBlockSortingCompresion(linea,&i,l);
			//MTF
			MTFcodificar(l,TAM_BLOQUE);
			//MODELO ESTRUCTURADO
			EstructuradoCodificar(l, TAM_BLOQUE);

			free(linea);

			//TODO: Sacar. Pruebo decodificacion.
			EstructuradoDecodificar(l, TAM_BLOQUE);
			MTFdecodificar(l,TAM_BLOQUE);
			aplicarBlockSortingDescompresion(l,i,&linea);
			int i;
			for(i=0;i<TAM_BLOQUE;i++)
				printf("%c\n", linea[i]);
			//printf("SALIDA  // %s\n", linea);

		//} //del while
	}
	else
		//TODO: completar
		if (strcmp(accion,"x")==0){
			printf("//Descomprimo//");
			//MODELO ESTRUCTURADO
			//???
			//MTF
			MTFdecodificar(l,TAM_BLOQUE);
			//BLOCK SORTING
			aplicarBlockSortingDescompresion(l,i,&linea);
			printf("%s",linea);
		}
		else{
				fprintf(stderr,ERR_ACCION);
				return -1;
		}
	return 0;
}

int validar_parametros(int argc,char **argv,char** accion,char** ruta1)
{
	char aux;

	if (argc!=3)
		return -1;
	if (argv[1][0]!='-')
		return -1;

	*accion = (char*)malloc((strlen(argv[1])+1)*sizeof(char));
	sscanf(argv[1],"%c%s",&aux,*accion);

	*ruta1= (char*)malloc((strlen(argv[2])+1)*sizeof(char));
	if (!*ruta1)
		return -1;
	strcpy(*ruta1,argv[2]);
	return 0;
}

//TODO: Sacar
//ejemplo(el que pusimos en el informe) de como se corre el mtf
/*int main() {

	unsigned char bloque[11] = "cdbd   aa a";
	codificar(bloque,11);
	int i;
	for (i = 0;i < 11;i++)
		printf("%i ",bloque[i]);

	printf("\n");

	decodificar(bloque,11);
	for (i = 0;i < 11;i++)
		printf("%c ",bloque[i]);

	return 0;
}*/
